﻿using System;
using Caliburn.Micro;
using Microsoft.Phone.Tasks;
using WPCloudPT.Eventos;
using WPCloudPT.Model;
using WPCloudPT.Utils;

namespace WPCloudPT.ViewModels
{
    public class MainPageViewModel : Screen, IHandle<AppMessage>, IHandle<EventoUtilizador>,
                                     IHandle<TaskCompleted<WebBrowserTask>>
    {
        #region ClassVars

        private static readonly Utilities Utils = Utilities.GetInstance();
        private readonly Func<MessageViewModel> _messageViewModelFactory;

        /// <summary>
        /// variaveis de classe
        /// </summary>
        private readonly INavigationService _navService;

        private readonly IWindowManager _windowManager;

        #endregion

        #region Propriedades
        /// <summary>
        /// propriedades da classe viewmodel e da view(o nome tem que ser igual na view e na viewmodel)
        /// </summary>
        private bool _canAutorizeApp;
        private bool _canCloudPtLogin;
        private bool _canGetAccountInfo;
        private bool _canGetPivotPage;
        private string _cloudPtInfo;
        private bool _isAuthVisible;
        private bool _isInfoUserActive;
        private Utilizador _tmpUtilizador;
        private string _txtAutPin;

        public string CloudPtInfo
        {
            get { return _cloudPtInfo; }
            set
            {
                _cloudPtInfo = value;
                NotifyOfPropertyChange(() => CloudPtInfo);
            }
        }

        public bool CanGotoPivotPage
        {
            get { return _canGetPivotPage; }
            set
            {
                if (value == _canGetPivotPage) return;
                _canGetPivotPage = value;
                NotifyOfPropertyChange(() => CanGotoPivotPage);
            }
        }

        public bool CanGetAccountInfo
        {
            get { return _canGetAccountInfo; }
            set
            {
                if (value == _canGetAccountInfo) return;
                _canGetAccountInfo = value;
                NotifyOfPropertyChange(() => CanGetAccountInfo);
            }
        }

        public bool CanCloudPtLogin
        {
            get { return _canCloudPtLogin; }
            set
            {
                if (value == _canCloudPtLogin) return;
                _canCloudPtLogin = value;
                NotifyOfPropertyChange(() => CanCloudPtLogin);
            }
        }

        public bool CanAuthorizeApp
        {
            get { return _canAutorizeApp; }
            set
            {
                if (value == _canAutorizeApp) return;
                _canAutorizeApp = value;
                NotifyOfPropertyChange(() => CanAuthorizeApp);
            }
        }


        public bool IsAuthVisible
        {
            get { return _isAuthVisible; }
            set
            {
                if (value != _isAuthVisible)
                {
                    _isAuthVisible = value;
                    NotifyOfPropertyChange(() => IsAuthVisible);
                }
            }
        }

        public string TxtAutPin
        {
            get { return _txtAutPin; }
            set
            {
                _txtAutPin = value;

                if (value != _txtAutPin)
                {
                    NotifyOfPropertyChange(() => TxtAutPin);
                }
            }
        }

        public Utilizador UserTemp
        {
            get { return _tmpUtilizador; }
            set
            {
                if (value == _tmpUtilizador) return;
                _tmpUtilizador = value;
                NotifyOfPropertyChange(() => UserTemp);
            }
        }

        public bool IsInfoUserActive
        {
            get { return _isInfoUserActive; }
            set
            {
                if (value == _isInfoUserActive) return;
                _isInfoUserActive = value;
                NotifyOfPropertyChange(() => IsInfoUserActive);
            }
        }

        #endregion

        #region Ctor

        /// <summary>
        ///  construtor da viewmodel
        /// </summary>
        /// <param name="value"></param>
        /// <param name="valuewindowManager"></param>
        /// <param name="valuemessageViewModelFactory"></param>
        public MainPageViewModel(INavigationService value, IWindowManager valuewindowManager,
                                 Func<MessageViewModel> valuemessageViewModelFactory)
        {
            DisplayName = "Home";
            _navService = value;
            _windowManager = valuewindowManager;
            _messageViewModelFactory = valuemessageViewModelFactory;
        }

        #endregion

        #region Implementation of IHandle<AppMessage>

        /// <summary>
        /// implementacao do mecanismo de eventos com caliburn.micro 
        /// </summary>
        /// <param name="message"></param>
        public void Handle(AppMessage message)
        {
            if (message.TipoEvento == AppMessageType.Erro)
            {
                //invoca o metodo para mostrar um alerta
                MostraDialogo(message.EventoData, "Erro");
                //
            }
        }

        #endregion

        #region HandlerEventos

        #region IHandle<EventoUtilizador> Members

        public void Handle(EventoUtilizador message)
        {
            switch (message.EventoTipo)
            {
                case TipoEventoUtilizador.TokenOk:
                    CanAuthorizeApp = true;
                    UserTemp = message.TempUser;
                    //AuthorizeApp();

                    break;
                case TipoEventoUtilizador.AuthorizationOk:
                    UserTemp.OauthToken = message.TempUser.OauthToken;
                    UserTemp.OauthTokenSecret = message.TempUser.OauthTokenSecret;
                    TxtAutPin = "";
                    IsAuthVisible = false;
                    CanGetAccountInfo = true;
                    CanGotoPivotPage = true;
                    CanAuthorizeApp = false;
                    CanCloudPtLogin = false;
                    break;
                case TipoEventoUtilizador.TokenError:
                    MostraDialogo(message.DadosEventoUtilizador, "Erro ao obter o token");
                    break;
                case TipoEventoUtilizador.InfoUserOk:
                    UserTemp.IdUtilizador = message.TempUser.IdUtilizador;
                    UserTemp.MailUtilizador = message.TempUser.MailUtilizador;
                    UserTemp.NomeUtilizador = message.TempUser.NomeUtilizador;
                    UserTemp.UltimoAccessoUtilizador = message.TempUser.UltimoAccessoUtilizador;
                    UserTemp.UserActivo = message.TempUser.UserActivo;
                    UserTemp.DadosConvites = message.TempUser.DadosConvites;
                    UserTemp.DadosQuota = message.TempUser.DadosQuota;
                    UserTemp.DataCriacaoUtilizador = message.TempUser.DataCriacaoUtilizador;
                    Utils.TmpUser = UserTemp;
                    Utils.InjectaDadosUtilizador(UserTemp);
                    break;
            }
        }

        #endregion

        #region IHandle<TaskCompleted<WebBrowserTask>> Members

        public void Handle(TaskCompleted<WebBrowserTask> message)
        {
            MostraDialogo("estado: " + message.State + " resultado: " + message.Result, "teste");
        }

        #endregion

        #endregion

        #region Metodos
        /// <summary>
        /// metodos da framework e definidos pelo utilizador
        /// </summary>
        public void GotoPivotPage()
        {
            // 
            _navService.UriFor<ConteudoViewModel>().Navigate();
            
        }

        protected override void OnActivate()
        {
           
            EventAggregationProvider.Aggregator.Subscribe(this);
            CloudPtInfo = "Esta é uma prova de conceito para o windows phone \n funciona em windows phone 7.1 e 7.8";
            base.OnActivate();
        }

        protected override void OnDeactivate(bool close)
        {
            Utils.TmpUser = UserTemp;
           
            EventAggregationProvider.Aggregator.Unsubscribe(this);
            
            base.OnDeactivate(close);
        }

        /// <summary>
        /// metodo para lidar com o click do botao na view
        /// </summary>
        public void CloudPtLogin()
        {
            Utils.CloudPtOauth();
            //if (Utils.IsNetworkEnabled())
            //{

            //}
        }

        public void MostraDialogo(string value, string valueTitle)
        {
            MessageViewModel msgVm = _messageViewModelFactory();
            msgVm.Mensagem = value;
            msgVm.Title = valueTitle;
            _windowManager.ShowDialogWithFeedback(msgVm);
        }


        protected override void OnViewLoaded(object view)
        {
            base.OnViewLoaded(view);
            CanGotoPivotPage = false;

            CanGetAccountInfo = false;
            CanAuthorizeApp = false;
            CanCloudPtLogin = true;
            
            
        
        }

        /// <summary>
        /// metodo para lidar com o click do botao na view
        /// </summary>
        public void AuthorizeApp()
        {
            try
            {
                IsAuthVisible = true;


                var authUri = new Uri(CloudPtUrls.CloudPtUrl + CloudPtUrls.AuthTokenUrl + "?oauth_token=" +
                                      UserTemp.OauthToken, UriKind.Absolute);

                EventAggregationProvider.Aggregator.RequestTask<WebBrowserTask>();


                IsInfoUserActive = false;

                var tmpBrowserTask = new WebBrowserTask {Uri = authUri};
                tmpBrowserTask.Show();
            }
            catch (Exception e)
            {
                EventAggregationProvider.Aggregator.Publish(new AppMessage(AppMessageType.Erro, e.Message));
            }
        }

        /// <summary>
        /// metodo para lidar com o click do botao na view
        /// </summary>
        public void AutorizarAplicacao()
        {
            if ((string.IsNullOrEmpty(TxtAutPin)) || (string.IsNullOrWhiteSpace(TxtAutPin)))
            {
                MostraDialogo("Nao foi digitado o valor do pin para autorizar a aplicacao", "Erro Pin Autenticacao");
            }
            else
            {
                Utils.AuthorizeApp(CloudPtUrls.CloudPtConsumerKey,
                                   CloudPtUrls.CloudPtConsumerSecret, UserTemp.OauthToken, UserTemp.OauthTokenSecret,
                                   TxtAutPin);
            }
        }

        /// <summary>
        /// metodo para lidar com o click do botao na view
        /// </summary>
        public void GetAccountInfo()
        {
            _navService.UriFor<InfoUserViewModel>().Navigate();
        }

        #endregion
    }
}